package main

import (
	_case "basis/11-function/case"
	"context"
	"fmt"
	"os"
	"os/signal"
)

func main() {
	var a, b = 10, 20
	//直接调用函数
	fmt.Println(_case.Sum(a, b))
	//函数赋值变量，执行函数
	f1 := _case.Sum
	fmt.Println(f1(a, b))

	//将函数作为输入输出实现中间件
	f2 := _case.LogMiddleware(_case.Sum)
	//再次附加中间件
	f2 = _case.LogMiddleware(f2)
	fmt.Println(f2(a, b))

	// 函数强转函数类型
	f3 := _case.SumFunc(f1)
	fmt.Println(f3.Accumulation(1, 2, 3, 4))
	fmt.Println(f2.Accumulation(1, 2, 3, 4, 5))

	// 0 1 1 2 3 5 8 13 21 34
	fmt.Println(_case.Fib(0))
	fmt.Println(_case.Fib(2))
	fmt.Println(_case.Fib(5))
	fmt.Println(_case.Fib(10))

	//闭包的陷阱 1.18版本输出 都是10
	//新版本输出 0-10
	//传参的方式，没有版本问题：输出0-10
	_case.ClosureTrap()
	ctx, cannel := signal.NotifyContext(context.Background(), os.Interrupt, os.Kill)
	defer cannel()
	<-ctx.Done()
}
